package com.novatec.mvc.controlador;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.novatec.beans.Cajas;
import com.novatec.beans.ContratoBean;
import com.novatec.beans.Productos;
import com.novatec.beans.SolicitudesDevolucion;
import com.novatec.dao.SolicitudesDAO;
import com.novatec.mvc.modelo.ClienteItem;
import com.novatec.mvc.modelo.SolPedidoItem;
import com.novatec.mvc.modelo.Solicitud;
import com.novatec.mvc.servicio.SolicitudesService;
import com.novatec.util.Constantes;
import com.novatec.util.Sesion;

@Controller
public class Solicitudes {
	private Logger log = Logger.getLogger(this.getClass());
	
	@Autowired
	private SolicitudesService sol;
	@Autowired
	private SolicitudesDAO solDao;

	@Autowired
	private Sesion sesUsuario;
	
	
	// Para el cambio de estado de las solicitudes. Ejemplo: REGISTRADO -> ATENDIDO
	@RequestMapping("/cambiarEstadoSolicitud")
	public String cambiarEstado(@RequestParam(value="nroOrden[]") Long[] nroOrden,
								@RequestParam(value="estado[]") Long[] estado,
								@RequestParam(value="transaccion[]") String[] transaccion,
								@RequestParam(value="ischange[]") Boolean[] ischange,
								@RequestParam(value="guia[]") String[] guia) {
		log.debug("cambiar estado de solicitudes");
		sol.actualizarEstado(nroOrden, estado, transaccion, ischange, guia);

		return "redirect:/intranet/frameEnBlanco";
	}
	

	@RequestMapping("/pedidos")
	public ModelAndView cargarFormPedidos() {

		// llamar al servicio para
		ModelAndView mavPedido = new ModelAndView("formRegPedidos");

		// simulando id de cliente de session
		// simulando id de contrato

		// validar la vigencia del contrato

		// si en contrato se especifica que pack rental envia al cliente,
		// se carga en el form de solicitud resp, dir envio y ref 0
		// en el contrato se especifica
		// 1 envia a pack rental dir pack rental, resp
		// 0 se envia al cliente

		// llamar a los servicios que trae los productos para el cliente

		// saldo de cajas del tipo seleccionado
		// saldo de cajas
		// modelo correspondiente

		
		ContratoBean conItem = sol.recuperarContratoCliente( sesUsuario.getIdUsuario(), Constantes.VIGENTE);
		
		List listaProductos = sol.recuperarProductosXContrato(conItem.getIdContrato());
		
		
		
		mavPedido.addObject("nroOrden", sol.generarNroOrden());
		mavPedido.addObject("direcAlamcen", sol.obtenerDireccion());
		mavPedido.addObject("tipoEnvio", conItem.getTipoPedido());
		
		mavPedido.addObject("totalProductos",listaProductos.size());
		mavPedido.addObject("listaProductos", listaProductos);
		mavPedido.addObject("nrocontrato", conItem.getIdContrato());
		mavPedido.addObject("ocultarBotones", Constantes.NO_OCULTAR_BOTONES);
		mavPedido.addObject("comodinDetalle", "ped");
		mavPedido.addObject("responsable", "0");
		
		return mavPedido;
	}
	
	@RequestMapping("/devoluciones")
	public ModelAndView cargarFormDevoluciones(HttpServletRequest req , HttpServletResponse resp) {

		// llamar al servicio para
		ModelAndView mavPedido = new ModelAndView("formRegDevoluciones");
		
		ContratoBean conItem = sol.recuperarContratoCliente( sesUsuario.getIdUsuario(), Constantes.VIGENTE);
		
		List<?> listaProductos = sol.recuperarProductosXContrato(conItem.getIdContrato());
		
		SolicitudesDevolucion devolucion = solDao.recuperarTotalDevolucionesPorCliente(sesUsuario.getIdUsuario());
		
		mavPedido.addObject("nroOrden", sol.generarNroOrden());
		mavPedido.addObject("direcAlamcen", sol.obtenerDireccion());
		if(conItem.getTipoDevolucion()!=null){
			mavPedido.addObject("tipoEnvio", conItem.getTipoDevolucion());
		}else{
			
			mavPedido.addObject("tipoEnvio", "1");
		}
		
		
		System.out.println("Tipo Envio :" +conItem.getTipoDevolucion());
		mavPedido.addObject("totalProductos",listaProductos.size());
		mavPedido.addObject("listaProductos", listaProductos);
		mavPedido.addObject("nrocontrato", conItem.getIdContrato());
		mavPedido.addObject("responsable", "0");
		mavPedido.addObject("comodinDetalle", "dev");
		mavPedido.addObject("ocultarBotones", Constantes.NO_OCULTAR_BOTONES);
		mavPedido.addObject("reposicion", null);
		mavPedido.addObject("maxDevoluciones", conItem.getMaxDevoluciones());
		mavPedido.addObject("maxAdicionalesCaja",conItem.getMaxAdicionalesCajas());
		mavPedido.addObject("totalDevoluciones",devolucion.getTotalSolicitudesDevolucion());
		
		return mavPedido;
	}
	
	
	@RequestMapping("/guardarSoliciutdPedido")
	public ModelAndView guardarSolicitudPedido(HttpServletRequest req,
			HttpServletResponse resp) throws ParseException {

		ModelAndView mavPedido = new ModelAndView("formRegPedidosOK");
		
        SolPedidoItem solPedItem = new SolPedidoItem();
		
        HttpSession ses = req.getSession(true);
        
        if(ses.getAttribute("objetoSolPedido")!=null){
        	solPedItem = (SolPedidoItem) ses.getAttribute("objetoSolPedido");
        	solPedItem.setIdCliente(sesUsuario.getIdUsuario());
    		solPedItem.setIdSolicitudEstado(new Long("1"));
    		solPedItem.setTransaccion("pedido");
    		solPedItem.setGuia("");
    		solDao.guardarSolicitudPedido(solPedItem);
    		//hacer la transaccion de los detalles
    		for(int i = 0; i<solPedItem.getListaCajas().size() ; i++){
    			Cajas caja =  solPedItem.getListaCajas().get(i);
    			//considerar las cantidades que son diferentes de cero
    			if (caja.getCantidadSeleccionada()>0){
    				
    				solPedItem.setNroCajas(caja.getCantidadSeleccionada());
    				solPedItem.setIdTipoCaja(caja.getIdTipoCaja());
    				solDao.guardarSolicitudPedidoDetalle(solPedItem);
    				//fvilla 11-04-2012 ini
    					//solDao.actualizarSaldoDisponible(solPedItem.getIdContrato(), caja.getIdTipoCaja(), (caja.getSaldoDisponible()-caja.getCantidadSeleccionada()));
    					//todas las solicitudes nuevas se guardan en estado registrado y no modifican el saldo
    					//solDao.actualizarSaldoDisponible(solPedItem.getIdContrato(), caja.getIdTipoCaja(), (caja.getSaldoDisponible()));
    				//fvilla 11-04-2012 fin
    			}
    		}
    		
        }
    
		return mavPedido;
	}

	@RequestMapping("/guardarSolicitudDevolucion")
	public ModelAndView guardarSolicitudDevolucion(HttpServletRequest req,
			HttpServletResponse resp) throws ParseException {

		// fvilla 12-04-2012 ini
			//ModelAndView mavPedido = new ModelAndView("ingreso");
			ModelAndView mavPedido = new ModelAndView("formRegPedidosOK");
		// fvilla 12-04-2012 fin
		
        SolPedidoItem solPedItem = new SolPedidoItem();
		
        HttpSession ses = req.getSession(true);
        
        if(ses.getAttribute("objetoSolPedido")!=null){
        	solPedItem = (SolPedidoItem) ses.getAttribute("objetoSolPedido");
        	solPedItem.setIdCliente(sesUsuario.getIdUsuario());
    		solPedItem.setIdSolicitudEstado(new Long("1"));
    		solPedItem.setTransaccion("devolucion");
    		solPedItem.setGuia("");
    		solDao.guardarSolicitudPedido(solPedItem);
    		//hacer la transaccion de los detalles
    		for(int i = 0; i<solPedItem.getListaCajas().size() ; i++){
    			Cajas caja =  solPedItem.getListaCajas().get(i);
    			//considerar las cantidades que son diferentes de cero
    			if (caja.getCantidadSeleccionada()>0){
    				
    				solPedItem.setNroCajas(caja.getCantidadSeleccionada());
    				solPedItem.setIdTipoCaja(caja.getIdTipoCaja());
    				solDao.guardarSolicitudPedidoDetalle(solPedItem);
    				
    				//fvilla 11-04-2012 ini
    					// una solicitud de devolucion se crea en estado registrado y el estado registrado no actualiza saldos
    					//solDao.actualizarSaldoPorDevolver(solPedItem.getIdContrato(), caja.getIdTipoCaja(), caja.getCantidadSeleccionada());
    				//fvilla 11-04-2012 fin
    				
    			}
    		}
    		
        }
    
		return mavPedido;
	}
	
	@RequestMapping("/resumenPedidos")
	public ModelAndView cargarResumenPedidos(HttpServletRequest req,
			HttpServletResponse res) throws ParseException {
		// recuperar los parametros del request y volverlos a mandar a la vista

		// transaccion es pedido o solicitud
		HttpSession ses = req.getSession(true);
		ses.removeAttribute("objetoSolPedido");
		SolPedidoItem solPedItem = parseaSolPedidoFromRequest(req);
		
		
		ModelAndView mavPedido = new ModelAndView("formResRegPedidos");
		
		solPedItem.setIdContrato(new Long(req.getParameter("nrocontrato")));
		
		
		mavPedido.addObject("orden", solPedItem.getNroOrden());
		mavPedido.addObject("fechaejecucion",
				req.getParameter("fechaejecucion"));
		mavPedido.addObject("direccionenvio", solPedItem.getAlmacenCliente());
		mavPedido.addObject("idTipoCajaModeloCaja", solPedItem.getIdTipoCaja()
				+ "/" + solPedItem.getDescTipoCaja());
		mavPedido.addObject("responsable", solPedItem.getResponsable());
		mavPedido.addObject("referencia", solPedItem.getReferencia());
		mavPedido.addObject("tipoEnvio", solPedItem.getTipoEnvio());
		mavPedido.addObject("productosSeleccionados", solPedItem.getListaCajas());
		mavPedido.addObject("totalProductos", solPedItem.getTotalProductos());
		
		
		ses.setAttribute("objetoSolPedido", solPedItem);
		
		
	
		return mavPedido;
	}

	@RequestMapping("/resumenDevoluciones")
	public ModelAndView cargarResumenDevoluciones(HttpServletRequest req,
			HttpServletResponse res) throws ParseException {
		// recuperar los parametros del request y volverlos a mandar a la vista
		ModelAndView mavPedido = new ModelAndView("formResRegDevolucion");
		// transaccion es pedido o solicitud
		HttpSession ses = req.getSession(true);
		ses.removeAttribute("objetoSolPedido");
		SolPedidoItem solPedItem = parseaSolPedidoFromRequest(req);
		String [] reposicion = req.getParameterValues("reposicion");
		if(reposicion!=null){
		
		if(reposicion[0].equals("1")){
			mavPedido.addObject("reposicion", "si");
			solPedItem.setReposicion(reposicion[0]);
			}else{
				mavPedido.addObject("reposicion", "no");
				solPedItem.setReposicion("0");
			}
		}
		
		
		solPedItem.setIdContrato(new Long(req.getParameter("nrocontrato")));
		
		
		mavPedido.addObject("orden", solPedItem.getNroOrden());
		mavPedido.addObject("fechaejecucion",
				req.getParameter("fechaejecucion"));
		mavPedido.addObject("direccionenvio", solPedItem.getAlmacenCliente());
		//mavPedido.addObject("saldoDisponible", solPedItem.getSaldoCajas());
		//mavPedido.addObject("nroCajas", solPedItem.getNroCajas());
		//mavPedido.addObject("modeloCajas1", solPedItem.getDescTipoCaja());
		mavPedido.addObject("idTipoCajaModeloCaja", solPedItem.getIdTipoCaja()
				+ "/" + solPedItem.getDescTipoCaja());
		mavPedido.addObject("responsable", solPedItem.getResponsable());
		mavPedido.addObject("referencia", solPedItem.getReferencia());
		mavPedido.addObject("tipoEnvio", solPedItem.getTipoEnvio());
		mavPedido.addObject("productosSeleccionados", solPedItem.getListaCajas());
		mavPedido.addObject("totalProductos", solPedItem.getTotalProductos());
		
		
			
		
		ses.setAttribute("objetoSolPedido", solPedItem);
		
		req.setAttribute("objeto",solPedItem );
	
		return mavPedido;
	}
	
	public SolPedidoItem parseaSolPedidoFromRequest(HttpServletRequest req)
			throws ParseException {

		SolPedidoItem solPedItem = new SolPedidoItem();
		
		List listaModelosCajasSeleccionados = new ArrayList();
		
		SimpleDateFormat ts = new SimpleDateFormat("MM/dd/yyyy");
		Date sqlToday = new java.sql.Date(ts.parse(
				req.getParameter("fechaejecucion")).getTime());
		solPedItem.setAlmacenCliente(req.getParameter("direccionenvio"));
		solPedItem.setNroOrden(new Long(req.getParameter("orden")));
		solPedItem.setFechaEjecucion(sqlToday);
		GregorianCalendar gc  = new GregorianCalendar();
		solPedItem.setFechaRegistro(new Date(gc.getTimeInMillis()));
		solPedItem.setTipoEnvio(req
				.getParameter("tipoEnvio"));
		solPedItem.setResponsable(req.getParameter("responsable"));
		solPedItem.setReferencia(req.getParameter("referencia"));
		solPedItem.setTotalProductos(Integer.parseInt(req.getParameter("totalProductos")));
		
		for (int i=0; i<solPedItem.getTotalProductos(); i++){
			Cajas caj = new Cajas();
		
		
			caj.setSaldoDisponible(Integer.parseInt(req
					.getParameter("saldoDisponible"+i)));
			if(!req.getParameter("nroCajas"+i).equals("")){
			caj.setCantidadSeleccionada(Integer.parseInt(req.getParameter("nroCajas"+i)));
			}else{
				caj.setCantidadSeleccionada(0);
				
			}
			String[] modelo = req.getParameter("modeloCajas"+i).split("/");
			
			if (modelo.length > 1) {
				
				caj.setDescModeloCaja(modelo[1]);
				caj.setIdTipoCaja(new Long(modelo[0]));
				

			}
			listaModelosCajasSeleccionados.add(caj);
			
		}
		solPedItem.setListaCajas(listaModelosCajasSeleccionados);
		
			return solPedItem;
	}


	//dyanez
	@RequestMapping("/solicitud")
	public ModelAndView getPedido(@RequestParam("noorden") String noorden) {
		Solicitud solicitud = solDao.findSolicitud(Long.parseLong(noorden));

		ModelAndView mav;
		if(solicitud.getTipoSolicitud().equals("PEDIDO"))
			mav = new ModelAndView("formPedido");
		else if(solicitud.getTipoSolicitud().equals("DEVOLUCION"))
			mav = new ModelAndView("formDevolucion");
		else
			mav = new ModelAndView("formLogin");

		mav.addObject("nContrato", solicitud.getnContrato());
		mav.addObject("nOrden", solicitud.getnOrden());
		mav.addObject("fechaEmision", solicitud.getFechaEmision());
		mav.addObject("responsable", solicitud.getResponsable());
		mav.addObject("direccion", solicitud.getDireccion());
		mav.addObject("referencia", solicitud.getReferencia());

		Map<String, Integer> mapCantidades = solDao.getListCantidades(Long.parseLong(noorden));
		mav.addObject("",null);

		return mav;
	}
	
	@RequestMapping(value="/ajaxComboProductos", method=RequestMethod.POST)
	public @ResponseBody String getAvailability() {
		
		return "ajax";
	}
	
	@RequestMapping("/detPedido")
	public ModelAndView getDetPedido(@RequestParam("nroContrato") String nroContrato, @RequestParam("fechEjec") String fecEjec, @RequestParam("nroOrden") String orden){
		
		ModelAndView mavDetPedido = new ModelAndView("formRegPedidos");
		
		Long idContrato = new Long(nroContrato);
		//final List<?> listaProductos = sol.recuperarProductosXContrato(idContrato);
		
		final List<?> listaProductos = sol.recuperarProductosDetSolicitud( idContrato, new Long(orden) );
		
		ClienteItem item = sol.obtenerIdClienteDesdeContrato(idContrato);
		
		ContratoBean conItem = sol.recuperarContratoCliente( item.getIdUsuario(), Constantes.VIGENTE);
		////aca
		String responsable = "";
		String direnvio = "";
		String refenvio = "";
		
		for (int i=0 ; i < listaProductos.size() ; i++){
			Productos prod = (Productos) listaProductos.get(i);
			responsable = prod.getResponsable();
			direnvio = prod.getDirenvio();
			refenvio = prod.getRefenvio();
			
			break;
		}
		mavDetPedido.addObject("nroOrden", orden);
		mavDetPedido.addObject("direcAlamcen", sol.obtenerDireccion());
		mavDetPedido.addObject("tipoEnvio", conItem.getTipoPedido());
		
		mavDetPedido.addObject("totalProductos",listaProductos.size());
		mavDetPedido.addObject("listaProductos", listaProductos);
		mavDetPedido.addObject("nrocontrato", conItem.getIdContrato());
		mavDetPedido.addObject("fechaejecucion", fecEjec);
		mavDetPedido.addObject("comodinDetalle", "det");
		mavDetPedido.addObject("ocultarBotones", Constantes.SI_OCULTAR_BOTONES);
		mavDetPedido.addObject("responsable", responsable);
		mavDetPedido.addObject("direnvio", direnvio);
		mavDetPedido.addObject("refenvio", refenvio);
		

		return mavDetPedido;
	}
	
	@RequestMapping("/detDevolucion")
	public ModelAndView getDetDevolucion(@RequestParam("nroContrato") String nroContrato, @RequestParam("fechEjec") String fecEjec, @RequestParam("nroOrden") String orden){
		
		/////aca
		ModelAndView mavDetPedido = new ModelAndView("formRegDevoluciones");
		
		Long idContrato = new Long(nroContrato);
		//final List<?> listaProductos = sol.recuperarProductosXContrato(idContrato);
		
		final List<?> listaProductos = sol.recuperarProductosDetSolicitud( idContrato, new Long(orden) );
		
		ClienteItem item = sol.obtenerIdClienteDesdeContrato(idContrato);
		
		ContratoBean conItem = sol.recuperarContratoCliente( item.getIdUsuario(), Constantes.VIGENTE);
		
		String responsable = "";
		String direnvio = "";
		String refenvio = "";


		//fvilla 10-04-2012 ini
		//Cajas ca = sol.obtenerReposicionSolicitudDevolucion(new Long(orden), sesUsuario.getIdUsuario());
		Cajas ca = sol.obtenerReposicionSolicitudDevolucion(new Long(orden), item.getIdUsuario());
		//fvilla 10-04-2012 fin
		
		for (int i=0 ; i < listaProductos.size() ; i++){
			Productos prod = (Productos) listaProductos.get(i);
			responsable = prod.getResponsable();
			direnvio = prod.getDirenvio();
			refenvio = prod.getRefenvio();
			
			break;
		}
		mavDetPedido.addObject("nroOrden", orden);
		mavDetPedido.addObject("direcAlamcen", sol.obtenerDireccion());
		if(conItem.getTipoDevolucion()!=null){
		mavDetPedido.addObject("tipoEnvio", conItem.getTipoDevolucion());
		}else{
			mavDetPedido.addObject("tipoEnvio","1");
		}
		mavDetPedido.addObject("totalProductos",listaProductos.size());
		mavDetPedido.addObject("listaProductos", listaProductos);
		mavDetPedido.addObject("nrocontrato", conItem.getIdContrato());
		mavDetPedido.addObject("fechaejecucion", fecEjec);
		mavDetPedido.addObject("comodinDetalle", "det");
		mavDetPedido.addObject("ocultarBotones", Constantes.SI_OCULTAR_BOTONES);
		mavDetPedido.addObject("responsable", responsable);
		mavDetPedido.addObject("reposicion", ca.getReposicion());
		mavDetPedido.addObject("direnvio", direnvio);
		mavDetPedido.addObject("refenvio", refenvio);
	

		return mavDetPedido;
	}
	

}
